package 题目集.前缀和.差分;

//todo：还得做
//https://www.acwing.com/problem/content/102/

import java.util.Scanner;

/**
 *  给定一个数组，每次可以选择一个区间[l,r]，将区间内的所有数加上1或者减去1。
 *  问1，将数组中元素变成相同的数，所花费的最小次数。
 *  问2：求出在保证最少次数的前提下，最终得到的数列可能有多少种。
 */
public class 增减序列 {

    /**
     * 思路：
     *      全部相同的数，它在差分数组的上的意义是除了第一个数，2~n全为0。
     *      所以让一个数组变成全部相同的数，就是让差分数组中 2到n位置的数变成0的次数。
     *
     *      我们对原数组的操作有以下几种，对应的差分数组的操作是：
     *          1.修改数组的中间区域，对应的差分操作是：在 2~(n-1)中找一个i和j，对dif[i]++，dif[j]--（当然也可以dif[i]--,dif[j]++）
     *          2.修改左侧区域，对应的差分操作时：在 1~(n-1)中找一个i，修改dif[i]，dif[n+1]
     *          3.修改右侧区域，对应的差分操作是：在 2~n中找一个j，修改dif[1]，dif[j]
     *     这三种操作中，第一种操作一次会修改差分数组的两个数。第二种和第三种操作一次只会修改一个数（1和n+1，一个不需要变成0，一个没有意义）。
     *     所以我们最少的次数就是操作1的次数+操作2或操作3的次数。
     *
     *     所以问题1：就是求操作1的次数+操作2或操作3。即差分数组中2~n位置所有正数或负数较大的和
     *     问题2：就是求操作2或操作3的次数的方案数。即差分数组中2~n位置所有正数或负数的所有的和的差
     */
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] arr = new int[n + 2];
        int[] dif = new int[n + 2];
        for (int i = 1; i <= n; i++) {
            arr[i] = sc.nextInt();
            dif[i] = arr[i] - arr[i - 1];
        }
        long pos=0,neg=0;    //pos是正数的个数，neg是负数的个数
        for (int i = 2; i <= n; i++) {  //1位置的操作不影响，所以从2开始
            if (dif[i] > 0) {
                pos += dif[i];
            } else if (dif[i] < 0){
                neg += -dif[i];
            }
        }
        System.out.println(Math.max(pos,neg));  //至少要操作的次数。操作1之后+需要进行操作2或3的次数。操作1会将pos和neg中的一个变成0
        System.out.println(Math.abs(pos-neg)+1);  //操作2或3的方案数,+1是因为如果不需要操作2和3，也是一种方案
    }
}
